home *** CD-ROM | disk | FTP | other *** search
/ System Booster / System Booster.iso / Archives / Timing / clock1_2.lha / clock1_2 / progargs.c < prev    next >
C/C++ Source or Header  |  1994-05-16  |  4KB  |  158 lines

  1. /* progargs - a simple, extensible package for handling command line
  2.  * arguments and tooltypes.
  3.  *
  4.  * Copyright © 1993 by Peter Schachte
  5.  *
  6.  * I hereby grant everyone the right to use this code for any purpose
  7.  * whatsoever, so long as this copyright notice remains intact.
  8.  */
  9.  
  10. #include "progargs.h"
  11. #include <stdlib.h>
  12. #include <string.h>
  13. #include <exec/memory.h>
  14. #include <workbench/startup.h>
  15. #include <workbench/icon.h>
  16. #include <proto/dos.h>
  17. #include <proto/exec.h>
  18. #include <proto/icon.h>
  19.  
  20. struct Library *IconBase;
  21.  
  22. static struct DiskObject *diskobj;
  23. static char *string_chain = NULL;
  24.  
  25.  
  26. /* public */
  27. void handle_args(int argc, char **argv, struct arg_descriptor *args);
  28. void handle_args_finish(void);
  29. long my_atoi(char *string);
  30.  
  31. /* private */
  32. static void handle_arg(struct arg_descriptor *arg, char *value);
  33. static void handle_cmd_line(char **argv, struct arg_descriptor *args);
  34.  
  35.  
  36. void handle_args(int argc, char **argv, struct arg_descriptor *args)
  37.     {
  38.     if (argc == 0) {
  39.         /* started from workbench:  get options from icon */
  40.         struct WBStartup *startup = (struct WBStartup *)argv;
  41.         LONG olddir;
  42.         struct arg_descriptor *ptr;
  43.         char *value;
  44.         char **toolarray;
  45.  
  46.         if (NULL == (IconBase=OpenLibrary(ICONNAME,1)))
  47.           return;
  48.  
  49.         olddir = CurrentDir(startup->sm_ArgList->wa_Lock);
  50.         diskobj = GetDiskObject(startup->sm_ArgList->wa_Name);
  51.         CurrentDir(olddir);
  52.         toolarray = diskobj->do_ToolTypes;
  53.         if (diskobj != NULL) {
  54.         for (ptr=args; ptr->name!=NULL; ++ptr) {
  55.             if (NULL != (value=FindToolType(toolarray,ptr->name))) {
  56.             handle_arg(ptr, value);
  57.             }
  58.         }
  59.         }
  60.         FreeDiskObject(diskobj);
  61.         CloseLibrary(IconBase);
  62.     } else {
  63.         handle_cmd_line(argv, args);
  64.     }
  65.     }
  66.  
  67.  
  68. void handle_args_finish(void)
  69.     {
  70.     char *ptr;
  71.  
  72.     for (; string_chain!=NULL; string_chain=ptr) {
  73.         ptr = (char*)*string_chain;
  74.         FreeMem(string_chain,
  75.             sizeof(char*) + strlen(string_chain+sizeof(char*)) + 1);
  76.     }
  77.     }
  78.  
  79.  
  80. static void handle_cmd_line(char **argv, struct arg_descriptor *args)
  81.     {
  82.     struct arg_descriptor *ptr;
  83.  
  84.     for (++argv; *argv; ++argv) {
  85.         for (ptr=args; ptr->name!=NULL&&stricmp(*argv, ptr->name); ++ptr);
  86.         if (ptr->name != NULL) {
  87.         if (ptr->value_allowed) {
  88.             handle_arg(ptr, *++argv);
  89.         } else {
  90.             handle_arg(ptr, NULL);
  91.         }
  92.         } /* note no error message about invalid option */
  93.     }
  94.     }
  95.  
  96.  
  97. static void handle_arg(struct arg_descriptor *arg, char *value)
  98.     {
  99.     (arg->parser)(value, arg->extra_parse_arg, arg->variable);
  100.     }
  101.  
  102.  
  103. int parse_int_arg(char *string, void *extra, void **value)
  104.     {
  105.     *value = (void *)my_atoi(string);
  106.     return 1;
  107.     }
  108.  
  109.  
  110. /* returns in *value a pointer to the string string.  We must copy string
  111.  * because it may be in an icon's tooltypes, and we are going to free the
  112.  * icon soon.  We collect the buffers we allocate in a chain pointed to by
  113.  * string_chain, so we can free them all when we're exiting
  114.  */
  115. int parse_string_arg(char *string, void *extra, void **value)
  116.     {
  117.     char *record = AllocMem((sizeof(char *)+strlen(string)+1), MEMF_ANY);
  118.     char *buff = record+sizeof(char *);
  119.     char **link = (char **)record;
  120.     
  121.     if (record==NULL) return 0;
  122.     *link = string_chain;
  123.     string_chain = record;
  124.     strcpy(buff, string);
  125.     *value = (void *)buff;
  126.     return 1;
  127.     }
  128.  
  129.  
  130. /* a quick and dirty atoi routine that doesn't use ctypes to keep size down */
  131. long my_atoi(char *string)
  132.     {
  133.     int negative = 0;
  134.     long value = 0;
  135.  
  136.     /* skip leading blanks */
  137.     while (*string == ' ') ++string;
  138.     if (*string == '-') {
  139.         negative = 1;
  140.         ++string;
  141.     }
  142.  
  143.     while (*string >= '0' && *string <= '9') {
  144.         value = (value*10 + *string - '0');
  145.         ++string;
  146.     }
  147.     if (negative) value = -value;
  148.     return value;
  149.     }
  150.  
  151.  
  152. int parse_bool_arg(char *string, void *extra, void **value)
  153.     {
  154.     *value = extra;
  155.     return 1;
  156.     }
  157.  
  158.